package java_thinking.unit_19._19_7_9;

import java.util.EnumMap;
import java.util.Map;

import static java_thinking.unit_19._19_7_9.AlarmPoints.*;

/**
 * @Desc:   EnumMap
 *      1.特殊的Map，它要求其中的键来自一个enum，内部由数组实现，与枚举类型键一起使用的专用 Map 实现
 *      2.枚举映射根据其键的自然顺序 来维护（该顺序是声明枚举常量的顺序）。
 *      3.非同步 Map<EnumKey, V> m = Collections.synchronizedMap(new EnumMap<EnumKey, V>(...));
 *      4.此类是 Java Collections Framework 的成员。
 *
 *      5.这里用到了命令设计模式，通常，命令模式首先需要一个只有单一方法的接口，然后从该接口实现具有各
 *        自不同的行为的多个子类，程序员就可以构造命令对象，并且在需要的时候使用它们。
 *      6.与产量相关的方法相比，EnumMap 有一个有点，EnumMap允许程序员改变值对象，而产量相关的方法在编译期
 *        就被固定了；
 *      7.EnumMap 可以实现多路分发；
 * @author: cww
 * @DateTime: 2019/5/23 19:34
 */
interface Command {
    void action();
}
public class EnumMaps {
    public static void main(String[] args) {
        EnumMap<AlarmPoints,Command> em = new EnumMap<AlarmPoints, Command>(AlarmPoints.class);
        em.put(KITCHEN, new Command() {
            @Override
            public void action() {
                System.out.println("KITCHEN fire!");
            }
        });
        em.put(UTILITY, new Command() {
            @Override
            public void action() {
                System.out.println("UTILITY fire!");
            }
        });
        em.put(BATHROOM, new Command() {
            @Override
            public void action() {
                System.out.println("BATHROOM take bath!");
            }
        });
        for (Map.Entry<AlarmPoints, Command> entry : em.entrySet()) {
            System.out.print(entry.getKey() + ": ");
            entry.getValue().action();
        }
        try {
            em.get(OFFICE4).action();
        } catch (Exception e) {
            System.out.println(e);
        }
    }
}
